/** Package GUI version 1.0. In questo package troverete tutte le procedure pubbliche necessarie per renderizzare l'interfaccia grafica del sito web. */

create or replace package package_gui as

-- Tipi di dati utilizzati nel Package GUI 

/** Array di coppie chiave valore di sessione NB uso interno */
packageGuiSessionCouples package_gui_statics.arrayVarcharVarchar;

/** Variabile di sessione pubblica, vi preghiamo si usare le procedure definite per la sessione e non l'accesso diretto a questa variabile */
packageGuiSessionVariable VARCHAR2(512) := '';

/** Array di regole di validazione da applicare agli input [NB: uso privato] */
arrayRules package_gui_statics.arrayRulesType;

/** Array di messaggi relativi alle regole di validazione da applicare agli input [NB: uso privato] */
arrayRulesMessage package_gui_statics.arrayRulesMessageType;

/** Tipo arrayVarcharVarchar, array associativo. Rappresenta le bread crumbs mostrate in ogni pagina. 
*   NB: l'ultimo elemnto dell'array deve avere come value la stringa vuota dato che non e' un link.
*   Nome link (key) => URL Link (value)
*/
defaultBreadCrumbsArray package_gui_statics.arrayVarcharVarchar;

/** Tipo arrayVarcharVarchar, array associativo, rappresenta i link da inseire nel menu delle operazioni sulla destra
*   Nome link (key) => URL Link (value)
*/
defaultOperationMenuLinkArray package_gui_statics.arrayVarcharVarchar;

/** Tipo arrayVarcharVarchar, array associativo, rappresenta i la lista delle opzioni da passare a un elemento di input select
*   key option (key) => value option (value)
*/
defaultParamList package_gui_statics.arrayVarcharVarchar;

/** Tipo arrayIntVarchar, usato come array di tipo key(int) => value(varchar2) */
defaultParamListVarchar2 package_gui_statics.arrayIntVarchar;

/* PROCEDURE STATICHE DA CHIAMARE PER L'INIZIALIZZAZIONE DELLA GUI */

/** 
* Procedura che fa il render della parte superiore del layout (head) 
*
* @param title Titolo della pagina
* @param cssFileList Lista di file css esterni (path fisico completo) da includere
* @param javascriptFileList Lista di file javascript esterni (path fisico completo) da includere
*/
procedure renderHead ( 
  title IN VARCHAR2 DEFAULT 'WebApplication BDL 2011',
  cssFileList IN package_gui_statics.arrayIntVarchar DEFAULT defaultparamlistvarchar2,
  javascriptFileList IN package_gui_statics.arrayIntVarchar DEFAULT defaultparamlistvarchar2
);

/** 
* Procedura che fa il render della parte iniziale della pagina 
* @param breadCrubs Array associativo di link (bread crumbs)
*/
procedure openPageBody( breadCrubs IN package_gui_statics.arrayVarcharVarchar DEFAULT defaultBreadCrumbsArray );

/** Procedura che fa chiude il page body */
procedure closePageBody;

/** Procedura che apre il page container */
procedure openPageContainer;

/** Procedura che chiude */
procedure closePageContainer;

/** Procedura che fa il render della parte superiore (apertura) del contenitore che ospitera' il contenuto dinamico */
procedure openContent;

/** Procedura che fa il render della parte inferiore (chiusura) del contenitore che ospitera' il contenuto dinamico */
procedure closeContent;

/** Procedura che apre il render della colonna di destra del layout */
procedure openSidebar;

/** Procedura che chiude il render della colonna di destra del layout */
procedure closeSidebar;

/** Procedura che fa il render del menu utente nella sidebar */
procedure renderUserMenu;

/** Procedura che fa il render del menu delle operazioni eseguibili in base all'azione attualmente eseguita e sul modello su cui viene eseguita l'azione (vedi documento interfacce) */
procedure renderOperationsMenu( operationLinks IN package_gui_statics.arrayVarcharVarchar DEFAULT defaultOperationMenuLinkArray );

/** Inizializzano il load di jQuery a inizio caricamento */
procedure openjQuerySnippet;

/** Chiude il load di jQuery a inizio caricamento */
procedure closejQuerySnippet;

/** Procedura che fa il render della parte finale del layout (footer) */
procedure renderFooter;

/* GESTIONE DEI FORM */

/** 
* Procedure che permette di renderizzare un messaggio di successo a schermo
*
* @param message Il messaggio di errore da stampare
*/
procedure renderSuccessMessage(
  message IN VARCHAR2 DEFAULT NULL
);

/** 
* Procedure che permette di renderizzare un messaggio di errore a schermo
*
* @param message Il messaggio di successo da stampare
*/
procedure renderErrorMessage(
  message IN VARCHAR2 DEFAULT NULL
);

/** 
* Funzione che inizializza la regola di validazione e ritorna la regola stessa
*
* @param is_required True se l'elemento e' obbligatorio, False altrimenti
* @param minlength Lunghezza minima che puo' assumere il valore dell'elemento di input
* @param maxlength Lunghezza massima che puo' assumere il valore dell'elemento di input
* @param rangelength Range di lunghezza che puo' assumere il valore dell'elemento di input
* @param min_val Valore minimo che puo' assumere il valore dell'elemento di input
* @param max_val Valore massimo che puo' assumere il valore dell'elemento di input
* @param range_val Range di valore che puo' assumere il valore dell'elemento di input
* @param email True se l'elemento deve rappresentare un'email in formato valido
* @param url True se l'elemento deve rappresentare una url in formato valido
* @param date_rule True se l'elemento deve rappresentare una data in formato valido
* @param only_number True se l'elemento deve rappresentare un numero in formato valido
* @param only_digit True se l'elemento deve rappresentare un numero digit in formato valido
*
* @return package_gui_statics.ruleDefinitionType La regola di validazione inizializzata
*/
function initRuleDefinition ( 
   is_required       BOOLEAN DEFAULT TRUE,
   minlength        BINARY_INTEGER DEFAULT NULL,
   maxlength        BINARY_INTEGER DEFAULT NULL,
   rangelength      VARCHAR2 DEFAULT NULL,
   min_val           BINARY_INTEGER DEFAULT NULL,
   max_val           BINARY_INTEGER DEFAULT NULL,
   range_val         VARCHAR2 DEFAULT NULL,
   email            BOOLEAN DEFAULT FALSE,
   url              BOOLEAN DEFAULT FALSE,
   date_rule         BOOLEAN DEFAULT FALSE,
   only_number       BOOLEAN DEFAULT FALSE,
   only_digit        BOOLEAN DEFAULT FALSE
) RETURN package_gui_statics.ruleDefinitionType;

/** 
* Funzione che inizializza i messaggi della regola di validazione e ritorna la regola stessa
*
* @param msg_is_required Messaggio di errore da applicare se l'elemento non e' obbligatorio ma non presente
* @param msg_minlength Messaggio di errore da applicare se la lunghezza dell'elemento non e' maggiore della soglia impostata
* @param msg_maxlength Messaggio di errore da applicare se la lunghezza dell'elemento e' maggiore della soglia applicata
* @param msg_rangelength Messaggio di errore da applicare se la lunghezza dell'elemento non rientra nel range
* @param msg_min_val Messaggio di errore da applicare se il valore dell'elemento non e' maggiore della sogli impostata
* @param msg_max_val Messaggio di errore da applicare se il valore dell'elemento non e' minore della sogli impostata
* @param msg_range_val Messaggio di errore da applicare se il valore dell'elemento non e' all'interno del range applicato
* @param msg_email Messaggio di errore da applicare se l'elemento non e' un'email valida
* @param msg_url Messaggio di errore da applicare se l'elemento non e' un url valida
* @param msg_date_rule Messaggio di errore da applicare se l'elemento non e' una data valida
* @param msg_only_number Messaggio di errore da applicare se l'elemento non e' un numero
* @param msg_only_digit Messaggio di errore da applicare se l'elemento non e' un numero in formato digit
*
* @return package_gui_statics.ruleMessageType I messaggi della regola di validazione inizializzati
*/
function initRuleMessage ( 
   msg_is_required      VARCHAR2 DEFAULT NULL,
   msg_minlength        VARCHAR2 DEFAULT NULL,
   msg_maxlength        VARCHAR2 DEFAULT NULL,
   msg_rangelength      VARCHAR2 DEFAULT NULL,
   msg_min_val          VARCHAR2 DEFAULT NULL,
   msg_max_val          VARCHAR2 DEFAULT NULL,
   msg_range_val        VARCHAR2 DEFAULT NULL,
   msg_email            VARCHAR2 DEFAULT NULL,
   msg_url              VARCHAR2 DEFAULT NULL,
   msg_date_rule        VARCHAR2 DEFAULT NULL,
   msg_only_number      VARCHAR2 DEFAULT NULL,
   msg_only_digit       VARCHAR2 DEFAULT NULL
) RETURN package_gui_statics.ruleMessageType;

/** 
* Procedure che aggiunge una regola di validazione relativa ad un elemento di input alla lista di regole appplicate alla form. 
* E' possibile specificare anche dei messaggi di errori per ogni singolo tipo di errore.
*
* @param elemName Il nome dell'elemento di input appartenente alla form
* @param validationRule Regola di validazione da applicare all'elemento
* @param validationRuleMessage Messaggi di errore relativi alle regole di validazione
*/
procedure addValidationRule(
  elemName IN VARCHAR2 DEFAULT NULL,
  validationRule IN package_gui_statics.ruleDefinitionType DEFAULT NULL,
  validationRuleMessage IN package_gui_statics.ruleMessageType DEFAULT NULL
);

/** 
* Procedure che aggiunge una label associata a un campo di input
*
* @param fieldId ID del field per cui e' creata la label
* @param labelClass Classe CSS della label
* @param labelValue Il testo della label
*/
PROCEDURE renderLabel (
  fieldId IN VARCHAR2 DEFAULT NULL,
  labelClass IN VARCHAR2 DEFAULT 'required',
  labelValue IN VARCHAR2 DEFAULT NULL
);

/** 
* Procedura che inizializza la grafica del campo di input
*/
PROCEDURE openInput;

/** 
* Procedura che chiude la grafica del campo di input
*/
PROCEDURE closeInput;

/** 
* Procedure che renderizza l'apertura di una form HTML 
* @param formName Il nome del form
* @param formId L'id del form
* @param formAction L'URL da richiamare all'azione submit
* @param formMethod Tipo di metodo per il passaggio dei parametri (GET o PUT)
* @param formEncType Encryption Type del form (per upload file, ecc ecc... )
*/
procedure openForm( 
  formName IN VARCHAR2 DEFAULT NULL,
  formId IN VARCHAR2 DEFAULT NULL,
  formAction IN VARCHAR2 DEFAULT NULL,
  formMethod IN VARCHAR2 DEFAULT NULL,
  formEncType IN VARCHAR2 DEFAULT NULL
);

/** Procedure che renderizza la chiusura di una form HTML */
procedure closeForm;

/** 
* Procedura che renderizza il bottone di submit della form
* @param title Il nome del bottone
*/
procedure renderSubmitButton( title IN VARCHAR2 DEFAULT 'Invia' );

/** 
* Procedura che renderizza un input field di tipo textfield
* 
* @param isRequired Notifica all'utente che il campo e' obbligatorio e non puo' essere lasciato vuoto.
* @param elemLabel L'etichetta da associare all'input
* @param elemName Il nome dell'input
* @param elemId L'identificatore dell'input
* @param elemValue Il valore da inserire nell'imput (usato per inizializzare il campo o ripopolarlo dopo il submit di un form)
* @param elemSize La lunghezza del campo di input
* @param elemMaxLength La massima lunghezza del testo che puo' essere inserito nell'input
* @param elemTip Il suggerimento da mostrare all'utente quando l'input e' nello stato di focus
* @param elemJavaScriptEvents Stringa di eventi Javascript da aggiungere all'input field
*/
procedure renderTextField (
  isRequired IN BOOLEAN DEFAULT FALSE,
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemValue IN VARCHAR2 DEFAULT NULL,
  elemSize IN BINARY_INTEGER DEFAULT 25,
  elemMaxLength IN BINARY_INTEGER DEFAULT 255,
  elemTip IN VARCHAR2 DEFAULT NULL,
  elemJavaScriptEvents IN VARCHAR DEFAULT ''
);

/** 
* Procedura che renderizza un input field di tipo textarea
* 
* @param isRequired Notifica all'utente che il campo e' obbligatorio e non puo' essere lasciato vuoto.
* @param elemLabel L'etichetta da associare all'input
* @param elemName Il nome dell'input
* @param elemId L'identificatore dell'input
* @param elemValue Il valore da inserire nell'imput (usato per inizializzare il campo o ripopolarlo dopo il submit di un form)
* @param elemRows Il numero delle righe della textarea
* @param elemCols Il numero delle colonne della textarea
* @param elemMaxLength La massima lunghezza del testo che puo' essere inserito nell'input
* @param elemTip Il suggerimento da mostrare all'utente quando l'input e' nello stato di focus
* @param elemJavaScriptEvents Stringa di eventi Javascript da aggiungere all'input field
*/
procedure renderTextAreaField (
  isRequired IN BOOLEAN DEFAULT FALSE,
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemValue IN VARCHAR2 DEFAULT NULL,
  elemRows IN VARCHAR2 DEFAULT 10,
  elemCols IN BINARY_INTEGER DEFAULT 35,
  elemMaxLength IN BINARY_INTEGER DEFAULT 255,
  elemTip IN VARCHAR2 DEFAULT NULL,
  elemJavaScriptEvents IN VARCHAR DEFAULT ''
);

/** 
* Procedura che renderizza un input field di tipo file field
* 
* @param isRequired Notifica all'utente che il campo e' obbligatorio e non puo' essere lasciato vuoto.
* @param elemLabel L'etichetta da associare all'input
* @param elemName Il nome dell'input
* @param elemId L'identificatore dell'input
* @param elemValue Il valore da inserire nell'imput (usato per inizializzare il campo o ripopolarlo dopo il submit di un form)
* @param elemSize La lunghezza del campo di input
* @param elemMaxLength La massima lunghezza del testo che puo' essere inserito nell'input
* @param elemTip Il suggerimento da mostrare all'utente quando l'input e' nello stato di focus
* @param elemJavaScriptEvents Stringa di eventi Javascript da aggiungere all'input field
*/
procedure renderFileField (
  isRequired IN BOOLEAN DEFAULT FALSE,
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemValue IN VARCHAR2 DEFAULT NULL,
  elemSize IN BINARY_INTEGER DEFAULT 25,
  elemMaxLength IN BINARY_INTEGER DEFAULT 255,
  elemTip IN VARCHAR2 DEFAULT NULL,
  elemJavaScriptEvents IN VARCHAR DEFAULT ''
);

/** 
* Procedura che renderizza un input field di tipo button
*
* @param elemName Il nome dell'input
* @param elemId L'identificatore dell'input
* @param elemValue Il valore da inserire nell'imput (usato per inizializzare il campo o ripopolarlo dopo il submit di un form)
* @param elemJavaScriptEvents Stringa di eventi Javascript da aggiungere all'input field
*/
procedure renderButton(
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemValue IN VARCHAR2 DEFAULT NULL,
  elemJavaScriptEvents IN VARCHAR DEFAULT ''
);

/** 
* Procedura che renderizza un input field di tipo dropdown (select)
* 
* @param isRequired Notifica all'utente che il campo e' obbligatorio e non puo' essere lasciato vuoto.
* @param elemLabel L'etichetta da associare all'input
* @param elemName Il nome dell'input
* @param elemId L'identificatore dell'input
* @param elemSelected L'identificatore del valore selezionato. Lasciare NULL o vuoto per l'inizializzazione.
* @param elemParamList Array associativo (varchar,varchar) per passare le coppie (key,value) da inserire nella dropdown.
* @param elemJavaScriptEvents Stringa di eventi Javascript da aggiungere all'input field
*/
procedure renderDropDown (
  isRequired IN BOOLEAN DEFAULT FALSE,
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemSelected IN VARCHAR2 DEFAULT NULL,
  elemParamList IN package_gui_statics.arrayVarcharVarchar DEFAULT defaultParamList,
  elemJavaScriptEvents IN VARCHAR DEFAULT ''
);

/** 
* Procedura che renderizza un input field di tipo multi dropdown (multiselect)
* 
* @param isRequired Notifica all'utente che il campo e' obbligatorio e non puo' essere lasciato vuoto.
* @param elemLabel L'etichetta da associare all'input
* @param elemName Il nome dell'input
* @param elemId L'identificatore dell'input
* @param elemSelectedList La lista di identificatori dei valori selezionati. Lasciare NULL o vuoto per l'inizializzazione.
* @param elemParamList Array associativo (varchar,varchar) per passare le coppie (key,value) da inserire nella dropdown.
* @param elemJavaScriptEvents Stringa di eventi Javascript da aggiungere all'input field
*/
procedure renderMultiDropDown(
  isRequired IN BOOLEAN DEFAULT FALSE,
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemSelectedList IN package_gui_statics.arrayIntVarchar DEFAULT defaultParamListVarchar2,
  elemParamList IN package_gui_statics.arrayVarcharVarchar DEFAULT defaultParamList,
  elemJavaScriptEvents IN VARCHAR DEFAULT ''
);

/** 
* Procedura che renderizza un input field di tipo password
*
* @param isRequired Notifica all'utente che il campo e' obbligatorio e non puo' essere lasciato vuoto.
* @param elemLabel L'etichetta da associare all'input
* @param elemName Il nome dell'input
* @param elemId L'identificatore dell'input
* @param elemValue Il valore da inserire nell'imput (usato per inizializzare il campo o ripopolarlo dopo il submit di un form)
* @param elemSize La lunghezza del campo di input
* @param elemMaxLength La massima lunghezza del testo che puo' essere inserito nell'input
* @param elemTip Il suggerimento da mostrare all'utente quando l'input e' nello stato di focus
* @param elemJavaScriptEvents Stringa di eventi Javascript da aggiungere all'input field
*/
procedure renderPasswordField (
  isRequired IN BOOLEAN DEFAULT FALSE,
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemValue IN VARCHAR2 DEFAULT NULL,
  elemSize IN BINARY_INTEGER DEFAULT 25,
  elemMaxLength IN BINARY_INTEGER DEFAULT 255,
  elemTip IN VARCHAR2 DEFAULT NULL,
  elemJavaScriptEvents IN VARCHAR DEFAULT ''
);

/** 
* Procedura che renderizza un input field di tipo hidden. Per ovvie ragioni non ci sono limiti di spazio e non c'e' il suggerimento.
*
* @param elemLabel L'etichetta da associare all'input
* @param elemName Il nome dell'input
* @param elemId L'identificatore dell'input
* @param elemValue Il valore da inserire nell'imput (usato per inizializzare il campo o ripopolarlo dopo il submit di un form)
* @param elemSize La lunghezza del campo di inputdistributore
* @param elemJavaScriptEvents Stringa di eventi Javascript da aggiungere all'input field
*/
procedure renderHiddenField (
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemValue IN VARCHAR2 DEFAULT NULL,
  elemSize IN BINARY_INTEGER DEFAULT 25,
  elemMaxLength IN BINARY_INTEGER DEFAULT 255,
  elemJavaScriptEvents IN VARCHAR DEFAULT ''
);

/** 
* Procedura che renderizza un input field di tipo checkbox
*
* @param isRequired Notifica all'utente che il campo e' obbligatorio e non puo' essere lasciato vuoto.
* @param elemLabel L'etichetta da associare all'input
* @param elemName Il nome dell'input
* @param elemId L'identificatore dell'input
* @param elemValue Il valore da inserire nell'imput (usato per inizializzare il campo o ripopolarlo dopo il submit di un form)
* @param elemTip Il suggerimento da mostrare all'utente quando l'input e' nello stato di focus
* @param elemChecked Se il parametro e' vuoto o nullo, l'elemento non verra' spuntato, altrimenti si.
* @param elemJavaScriptEvents Stringa di eventi Javascript da aggiungere all'input field
*/
procedure renderCheckBox (
  isRequired IN BOOLEAN DEFAULT FALSE,
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemValue IN VARCHAR2 DEFAULT NULL,
  elemTip IN VARCHAR2 DEFAULT NULL,
  elemChecked IN VARCHAR2 DEFAULT NULL,
  elemJavaScriptEvents IN VARCHAR DEFAULT ''
);

/** 
* Procedura che renderizza un input field di tipo radio-button
*
* @param isRequired Notifica all'utente che il campo e' obbligatorio e non puo' essere lasciato vuoto.
* @param elemLabel L'etichetta da associare all'input
* @param elemName Il nome dell'input
* @param elemId L'identificatore dell'input
* @param elemValue Il valore da inserire nell'imput (usato per inizializzare il campo o ripopolarlo dopo il submit di un form)
* @param elemTip Il suggerimento da mostrare all'utente quando l'input e' nello stato di focus
* @param elemChecked Se il parametro e' vuoto o nullo, l'elemento non verra' spuntato, altrimenti si.
* @param elemJavaScriptEvents Stringa di eventi Javascript da aggiungere all'input field
*/
procedure renderRadioButton (
  isRequired IN BOOLEAN DEFAULT FALSE,
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemValue IN VARCHAR2 DEFAULT NULL,
  elemTip IN VARCHAR2 DEFAULT NULL,
  elemChecked IN VARCHAR2 DEFAULT NULL,
  elemJavaScriptEvents IN VARCHAR DEFAULT ''
);

/** 
* Procedura che renderizza una lista di input field di tipo radio-button
*
* @param isRequired Notifica all'utente che il campo e' obbligatorio e non puo' essere lasciato vuoto.
* @param elemLabel L'etichetta da associare all'input
* @param elemName Il nome dell'input
* @param elemId L'identificatore dell'input
* @param elemTip Il suggerimento da mostrare all'utente quando l'input e' nello stato di focus
* @param elemParamList Array associativo (varchar2, varchar2) che rappresenta la coppia (id, value) di elementi radio-button da renderizzare.
* @param elemChecked L'identificatore dell'elemento della lista elemParamList da spuntare.
* @param elemJavaScriptEvents Stringa di eventi Javascript da aggiungere all'input field
*/
procedure renderRadioButtonList (
  isRequired IN BOOLEAN DEFAULT FALSE,
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemTip IN VARCHAR2 DEFAULT NULL,
  elemParamList IN package_gui_statics.arrayVarcharVarchar DEFAULT defaultParamList,
  elemChecked IN VARCHAR2 DEFAULT NULL,
  elemJavaScriptEvents IN VARCHAR DEFAULT ''
);

/** 
* Procedura che renderizza un input field di tipo Date Picker
*
* @param isRequired Notifica all'utente che il campo e' obbligatorio e non puo' essere lasciato vuoto.
* @param elemLabel L'etichetta da associare all'input
* @param elemName Il nome dell'input
* @param elemId L'identificatore dell'input
* @param elemValue Il valore da inserire nell'input (usato per inizializzare il campo o ripopolarlo dopo il submit di un form)
* @param elemSize La lunghezza del campo di input
* @param elemMaxLength La massima lunghezza del testo che puo' essere inserito nell'input
* @param elemTip Il suggerimento da mostrare all'utente quando l'input e' nello stato di focus
*/
procedure renderDatePicker (
  isRequired IN BOOLEAN DEFAULT FALSE,
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemValue IN VARCHAR2 DEFAULT NULL,
  elemSize IN BINARY_INTEGER DEFAULT 25,
  elemMaxLength IN BINARY_INTEGER DEFAULT 255,
  elemTip IN VARCHAR2 DEFAULT NULL
);

/** 
* Procedura che renderizza un input field di tipo Range Date Picker. Tramite questo tipo di elemento e' possibile specificare un range di date.
* NB: Una volta inviata la form i valori di questo input verranno immessi nei parametri get o put sotto il nome di: #elemId#_from e #elemId#_to dove #elemId# 
* rappresenta il valore del parametro elemId passato alla procedura.
*
* @param isRequired Notifica all'utente che il campo e' obbligatorio e non puo' essere lasciato vuoto.
* @param elemLabel L'etichetta da associare all'input
* @param elemName Il nome dell'input
* @param elemId L'identificatore dell'input
* @param elemValueFrom Il valore da inserire nell'imput (usato per inizializzare il campo o ripopolarlo dopo il submit di un form) della data di partenza
* @param elemValueTo Il valore da inserire nell'imput (usato per inizializzare il campo o ripopolarlo dopo il submit di un form) della data di ritorno
* @param elemSize La lunghezza del campo di input
* @param elemMaxLength La massima lunghezza del testo che puo' essere inserito nell'input
* @param elemTip Il suggerimento da mostrare all'utente quando l'input e' nello stato di focus
*/
procedure renderRangeDatePicker (
  isRequired IN BOOLEAN DEFAULT FALSE,
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemValueFrom IN VARCHAR2 DEFAULT NULL,
  elemValueTo IN VARCHAR2 DEFAULT NULL,
  elemSize IN BINARY_INTEGER DEFAULT 25,
  elemMaxLength IN BINARY_INTEGER DEFAULT 255,
  elemTip IN VARCHAR2 DEFAULT NULL
);

/** 
* Procedura che renderizza un input field di tipo Time Picker
* NB: Una volta inviata la form i valori di questo input verranno immessi nei parametri get o put sotto il nome di: #elemId#_hour e #elemId#_minute dove #elemId# 
* rappresenta il valore del parametro elemId passato alla procedura.
*
* @param isRequired Notifica all'utente che il campo e' obbligatorio e non puo' essere lasciato vuoto.
* @param elemLabel L'etichetta da associare all'input
* @param elemName Il nome dell'input
* @param elemId L'identificatore dell'input
* @param elemValueHour Il valore da inserire nell'input (usato per inizializzare il campo o ripopolarlo dopo il submit di un form) delle ore
* @param elemValueMinute Il valore da inserire nell'input (usato per inizializzare il campo o ripopolarlo dopo il submit di un form) dei minuti
* @param elemTip Il suggerimento da mostrare all'utente quando l'input e' nello stato di focus
*/
PROCEDURE renderTimePicker (
  isRequired IN BOOLEAN DEFAULT FALSE,
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemValueHour IN VARCHAR2 DEFAULT NULL,
  elemValueMinute IN VARCHAR2 DEFAULT NULL,
  elemTip IN VARCHAR2 DEFAULT NULL
);

/** 
* Procedura che renderizza un input field di tipo Ajax Text Field. Grazie a questo tipo di input sara' possibile creare un input textfield con auto completamento.
* E' possibile anche specificare il nome di un campo hidden da associare a questo elemento. Il campo hidden verra' popolato con l'identificatore dell'elemento scelto tramite l'autocompletametno.
* L'identificatore del campo hidden ( se visualizzato ) sara': #elemId#_hidden dove #elemId# rappresenta il valore passato alla procedura per il parametro elemId
*
* @param isRequired Notifica all'utente che il campo e' obbligatorio e non puo' essere lasciato vuoto.
* @param elemLabel L'etichetta da associare all'input
* @param elemName Il nome dell'input
* @param elemId L'identificatore dell'input
* @param elemValue Il valore da inserire nell'imput (usato per inizializzare il campo o ripopolarlo dopo il submit di un form)
* @param elemSize La lunghezza del campo di input
* @param elemMaxLength La massima lunghezza del testo che puo' essere inserito nell'input
* @param elemTip Il suggerimento da mostrare all'utente quando l'input e' nello stato di focus
*/
procedure renderAjaxTextField( 
  isRequired IN BOOLEAN DEFAULT FALSE,
  ajaxSource IN VARCHAR2 DEFAULT NULL,
  fillHidden IN BOOLEAN DEFAULT FALSE,
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemValue IN VARCHAR2 DEFAULT NULL,
  elemSize IN BINARY_INTEGER DEFAULT 25,
  elemMaxLength IN BINARY_INTEGER DEFAULT 255,
  elemTip IN VARCHAR2 DEFAULT NULL
);

/** 
* Procedura che inizializza una lista di widget Dynamic Field
*/
PROCEDURE initDynamicFieldList;

/** 
* Procedura che chiude una lista di widget Dynamic Field
*
* @param formId L'identificatore relativo al form di riferimento
* @param elemId L'identificatore dell'elemento di input
*/
PROCEDURE endDynamicFieldList (
  formId IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL
);

/** 
* Procedura che prepara la creazione di una widget Dynamic DropDown Field
*
* @param elemId L'identificatore dell'input
* @param elemIndex L'indice relativo all'elemento (vedi demo/esempi)
*/
PROCEDURE openDynamicTextFieldList (
  elemId IN VARCHAR2 DEFAULT NULL,
  elemIndex IN BINARY_INTEGER DEFAULT 1
);

/** 
* Procedura che chiude la creazione di una widget Dynamic DropDown Field
*
* @param elemLabel L'etichetta da associare all'input
* @param elemId L'identificatore dell'input
* @param elemIndex L'indice relativo all'elemento (vedi demo/esempi)
* @param paramList La lista dei valori relativi all'elemento di input passati da un form tramite chiamata POST o GET. Vedi l'utilizzo fatto nella demo/esempi
*/
PROCEDURE closeDynamicTextFieldList (
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemIndex IN BINARY_INTEGER DEFAULT 1,
  paramList IN package_gui_statics.arrayIntVarchar DEFAULT defaultParamListVarchar2
);

/*
PROCEDURE renderDynamicAjaxTextField(
  ajaxSource IN VARCHAR2 DEFAULT NULL,
  fillHidden IN BOOLEAN DEFAULT FALSE,
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemValue IN VARCHAR2 DEFAULT NULL,
  elemSize IN BINARY_INTEGER DEFAULT 25,
  elemMaxLength IN BINARY_INTEGER DEFAULT 255,
  elemTip IN VARCHAR2 DEFAULT NULL,
  elemIndex IN BINARY_INTEGER DEFAULT 1,
  paramList IN package_gui_statics.arrayIntVarchar DEFAULT defaultParamListVarchar2
);*/

/** 
* Procedura che renderizza un input field di tipo Dynamic Text Field. Grazie a questa widget potrete 
* creare una serie di campi input che si aggiorna automaticamente. L'utente disporra' di un bottone + e un bottone - per aumentare
* o dinuire gli input Textfield che vuole inserire. (Vedi demo ed esempi )
*
* @param isRequired Notifica all'utente che il campo e' obbligatorio e non puo' essere lasciato vuoto.
* @param elemLabel L'etichetta da associare all'input
* @param elemName Il nome dell'input
* @param elemId L'identificatore dell'input
* @param elemValue Il valore da inserire nell'imput (usato per inizializzare il campo o ripopolarlo dopo il submit di un form)
* @param elemSize La lunghezza del campo di input
* @param elemMaxLength La massima lunghezza del testo che puo' essere inserito nell'input
* @param elemTip Il suggerimento da mostrare all'utente quando l'input e' nello stato di focus
* @param elemIndex L'indice attuale relativo allo specifico DropDown Field da renderizzare
* @param paramList La lista dei valori relativi all'elemento di input passati da un form tramite chiamata POST o GET. Vedi l'utilizzo fatto nella demo/esempi
*/
PROCEDURE renderDynamicTextField(
  isRequired IN BOOLEAN DEFAULT FALSE,
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemValue IN VARCHAR2 DEFAULT NULL,
  elemSize IN BINARY_INTEGER DEFAULT 25,
  elemMaxLength IN BINARY_INTEGER DEFAULT 255,
  elemTip IN VARCHAR2 DEFAULT NULL,
  elemIndex IN BINARY_INTEGER DEFAULT 1,
  paramList IN package_gui_statics.arrayIntVarchar DEFAULT defaultParamListVarchar2
);

/** 
* Procedura che prepara la creazione di una widget Dynamic DropDown Field
*
* @param elemId L'identificatore dell'input
* @param elemIndex L'indice relativo all'elemento (vedi demo/esempi)
*/
PROCEDURE openDynamicDropDownFieldList (
  elemId IN VARCHAR2 DEFAULT NULL,
  elemIndex IN BINARY_INTEGER DEFAULT 1
);

/** 
* Procedura che chiude la creazione di una widget Dynamic DropDown Field
*
* @param elemLabel L'etichetta da associare all'input
* @param elemId L'identificatore dell'input
* @param elemIndex L'indice relativo all'elemento (vedi demo/esempi)
* @param paramList La lista dei valori relativi all'elemento di input passati da un form tramite chiamata POST o GET. Vedi l'utilizzo fatto nella demo/esempi
*/
PROCEDURE closeDynamicDropDownFieldList (
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemIndex IN BINARY_INTEGER DEFAULT NULL,
  paramList IN package_gui_statics.arrayIntVarchar DEFAULT defaultParamListVarchar2
);

/** 
* Procedura che renderizza un input field di tipo Dynamic DropDown Field. Grazie a questa widget potrete 
* creare una serie di campi input che si aggiorna automaticamente. L'utente disporra' di un bottone + e un bottone - per aumentare
* o dinuire gli input DropDown che vuole inserire. (Vedi demo ed esempi )
*
* @param isRequired Notifica all'utente che il campo e' obbligatorio e non puo' essere lasciato vuoto.
* @param elemLabel L'etichetta da associare all'input
* @param elemName Ils nome dell'input
* @param elemId L'identificatore dell'input
* @param elemSelected L'identificatore del valore selezionato. Lasciare NULL o vuoto per l'inizializzazione.
* @param elemParamList Array associativo (varchar,varchar) per passare le coppie (key,value) da inserire nella dropdown.
* @param elemIndex L'indice attuale relativo allo specifico DropDown Field da renderizzare
* @param paramList La lista dei valori relativi all'elemento di input passati da un form tramite chiamata POST o GET. Vedi l'utilizzo fatto nella demo/esempi
*/
PROCEDURE renderDynamicDropDownField(
  isRequired IN BOOLEAN DEFAULT FALSE,
  elemLabel IN VARCHAR2 DEFAULT NULL,
  elemName IN VARCHAR2 DEFAULT NULL,
  elemId IN VARCHAR2 DEFAULT NULL,
  elemSelected IN VARCHAR2 DEFAULT NULL,
  elemParamList IN package_gui_statics.arrayVarcharVarchar DEFAULT defaultParamList,
  elemIndex IN BINARY_INTEGER DEFAULT 1,
  paramList IN package_gui_statics.arrayIntVarchar DEFAULT defaultParamListVarchar2
);


--
-- MANAGE RECORDS SYSTEM 
--

/** 
* Procedura che apre la tabella di rappresentazione dei risultati di una ricerca.
*
* @param manageFormId L'identificativo unico da associare al form
* @param addictionalParameters Parametri aggiuntivi da agganciare al form e al pager del tipo: param1=value1&param2=value2&param3=value3...
* @param deleteFormAction L'url di destinazione della lista degli elementi da cancellare
* @param lowerBoundRecord Il limite inferiore di record visualizzati
* @param upperBoundRecord Il limite superiore di record visualizzati
* @param recordCount Il numero totale di record selezionabili
* @param columnNameArray La lista delle colonne da rappresentare.
* @param hasDeletePermission Se false non renderizza il bottone per eliminare un gruppo di elementi
* @param hasActions Se false non renderizza la colonna Actions
*/
PROCEDURE openManageTable(
  manageFormId IN VARCHAR2 DEFAULT 'manage-form',
  addictionalParameters IN VARCHAR2 DEFAULT '',
  deleteFormAction IN VARCHAR2 DEFAULT '',
  lowerBoundRecord IN BINARY_INTEGER DEFAULT 1,
  upperBoundRecord IN BINARY_INTEGER DEFAULT 1,
  recordCount IN BINARY_INTEGER DEFAULT 1,
  columnNameArray IN package_gui_statics.arrayIntVarchar DEFAULT defaultparamlistvarchar2,
  hasDeletePermission IN BOOLEAN DEFAULT TRUE,
  hasActions IN BOOLEAN DEFAULT TRUE
);

/** 
* Procedura che chiude la tabella di rappresentazione dei risultati. A questa tabella e' agganciato anche il widget Pager, 
* che permette di spostarsi sulle pagine dei risultati
*
* @param manageFormId L'identificativo unico da associare al form
* @param addictionalParameters Parametri aggiuntivi da agganciare al form e al pager del tipo: param1=value1&param2=value2&param3=value3...
* @param pagerLink Il link a cui reinderizzare la pagina
* @param pagerCurrent L'indice corrente di pagina
* @param pagerLast Il valore dell'indice di ultima pagina
* @pagerParamName Il nome nella URL da dare alla variabile che identifica l'attuale pagina di dati caricata
*/
PROCEDURE closeManageTable(
  manageFormId IN VARCHAR2 DEFAULT 'manage-form',
  addictionalParameters IN VARCHAR2 DEFAULT '',
  pagerLink IN VARCHAR2 DEFAULT NULL,
  pagerCurrent IN BINARY_INTEGER DEFAULT 1,
  pagerLast IN BINARY_INTEGER DEFAULT 1,
  pagerParamName IN VARCHAR2 DEFAULT 'page'
);

/** 
* Procedura che apre un record della tabella
*
* @param elemId L'identificatore unico dell'elemento da cancellare. NB: L'id e' l'ID SQL e NON quello HTML!!!
* @param hasDeletePermission Se false non renderizza le checbox per eliminare un gruppo di elementi
*/
PROCEDURE openManageTableRow(
  elemId IN VARCHAR2 DEFAULT NULL,
  hasDeletePermission IN BOOLEAN DEFAULT TRUE
);

/** 
* Procedura che chiude un record della tabella. Ad ogni record e' associata una serie di possibili azioni: view, update, delete.
*
* @param viewLink Link per visualizzare la pagina. Se nullo o vuoto significa che l'utente non ha i permessi necessari per l'operazione
* @param updateLink Link per visualizzare la pagina. Se nullo o vuoto significa che l'utente non ha i permessi necessari per l'operazione
* @param deleteLink Link per visualizzare la pagina. Se nullo o vuoto significa che l'utente non ha i permessi necessari per l'operazione
*/
PROCEDURE closeManageTableRow (
  viewLink IN VARCHAR2 DEFAULT NULL,
  updateLink IN VARCHAR2 DEFAULT NULL,
  deleteLink IN VARCHAR2 DEFAULT NULL
);

/** 
* Procedura che inizializza la chiusura della riga della tabella
*/
PROCEDURE initCloseManageTableRow;

/** 
* Procedura che renderizza un bottone per interagire con l'elemento della riga
*
* @param buttonImage L'url dell'immagine del bottone
* @param buttonLabel La label da associare al bottone (visualizzata se disabilitate le immagini per ragioni di usabilita')
* @param buttonUrl L'url che verra' chiamato quando viene effettuato il click sul bottone
*/
PROCEDURE renderManageTableRowButton (
  buttonImage IN VARCHAR2 DEFAULT NULL,
  buttonLabel IN VARCHAR2 DEFAULT NULL,
  buttonUrl IN VARCHAR2 DEFAULT NULL
);

/** 
* Procedura che renderizza i tre bottoni di default per interagire con la riga: view, update, delete
*
* @param viewLink Link per visualizzare la pagina. Se nullo o vuoto significa che l'utente non ha i permessi necessari per l'operazione
* @param updateLink Link per visualizzare la pagina. Se nullo o vuoto significa che l'utente non ha i permessi necessari per l'operazione
* @param deleteLink Link per visualizzare la pagina. Se nullo o vuoto significa che l'utente non ha i permessi necessari per l'operazione
*/
PROCEDURE renderDefManageTableButtons (
  viewLink IN VARCHAR2 DEFAULT NULL,
  updateLink IN VARCHAR2 DEFAULT NULL,
  deleteLink IN VARCHAR2 DEFAULT NULL
);

/** 
* Procedura che termina la chiusura della riga della tabella
*/
PROCEDURE finishCloseManageTableRow;

/** 
* Procedura che renderizza il valore di una colonna del record.
*
* @param elemValue Il valore della rispettiva colonna del record da rappresentare.
*/
PROCEDURE renderManageTableRow(
  elemValue IN VARCHAR2 DEFAULT NULL
);

-- PROCEDURE DEDICATE AL MANAGEMENT DELLA VARIABILE DI SESSIONE

/** 
* Crea ed inizializza una nuova sessione utente
*/
PROCEDURE newSession;

/** 
* Inizializza una sessione utente in base alla sessione passata
*
* @param sessionValue Il valore della sessione di sistema da settare. Prendere il valore dalla procedura getSession
*/
PROCEDURE setSession(
  sessionValue IN VARCHAR2 DEFAULT ''
);

PROCEDURE printSession;

/** 
* Funzione che ritorna la codifica della variabile di sessione
*
* @return VARCHAR2 Ritorna la stringa codificata che rappresenta la variabile di sessione utente
*/
FUNCTION getSession RETURN VARCHAR2;

/** 
* Funzione che ritorna un'informazione presente nella variabile di sessione codificata
* NB: se la chiave non e' presente, la funzione ritorna una stringa vuota.
*
* @return VARCHAR2 Ritorna il valore dell'informazione richiesta
*/
FUNCTION getSessionInformation(
 sessionInformationKey IN VARCHAR2 DEFAULT NULL
) RETURN VARCHAR2;

/** 
* Procedura che renderizza un campo hiddenField nella form dati con il nome passato
* NB: il nome dell'elemento ( e quindi del parametro nella GET ) e' private_status_success_message
*/
PROCEDURE renderHiddenFieldSession;

/** 
* Procedura usata per inserire una coppia (chiave, valore) nella variabile di sessione
*
* @param sessionInformationKey La chiave da inserire nella variabile di sessione
* @param sessionInformationValue Il valore relativo alla chiave da inserire
*/
PROCEDURE setSessionInformation(
  sessionInformationKey IN VARCHAR2 DEFAULT NULL,
  sessionInformationValue IN VARCHAR2 DEFAULT NULL
);

-------- PROCEDURE DEDICATE AL MANAGEMENT DELLA VIEW DELLE INFORMAZIONI

/** 
* Procedura che apre la tabella dati dell'interfaccia di Detail View
*/
PROCEDURE openViewTable;

/** 
* Procedura che chiude la tabella dati dell'interfaccia di Detail View
*/
PROCEDURE closeViewTable;

/** 
* Procedura disegna una riga di dati della tabella
*
* @param keyString La label dell'informazione da visualizzare
* @param valueString L'informazione da visualizzare
* @rowCSSClass La classe CSS da passare. NB: Usare solo "odd" o "even" a righe alterne.
*/
PROCEDURE renderViewTableRow (
  keyString IN VARCHAR2 DEFAULT NULL,
  valueString IN VARCHAR2 DEFAULT NULL,
  rowCSSClass IN VARCHAR2 DEFAULT NULL
);

/** 
* Procedura che permette di renderizzare con una sola istruzione tutta l'interfaccia di DetailView. Da usare al posto della
* sequenza di istruzioni openViewTable, serie di renderViewTable, closeViewTable
*
* @param paramList Array di coppie (label informazione, valore informazione) da stampare. Vedi usage_gui.renderViewDetail
*                  per il risultato
*/
PROCEDURE renderViewTable(
  paramList IN package_gui_statics.arrayVarcharVarchar DEFAULT defaultParamList
);

---------------------- LOGIN PAGE ----------------------------

/** 
* Funzione che processa i dati di login e controlla sul db se l'utente e' presente. Se l'utente e' presente ritorna la sessione creata con l'utente, password e il ruolo
* altrimenti ritorna una stringa vuota (utente non autenticato)
*
* @param username Il nome utente
* @param password La password relativa all'utente
* @return VARCHAR2 La sessione creata o stringa vuota se non e' andata a buon fine l'autenticazione
*/
FUNCTION processLogin( 
  usernameParam IN VARCHAR2 DEFAULT NULL,
  passwordParam IN VARCHAR2 DEFAULT NULL
) RETURN VARCHAR2;

/** 
* Procedura che effettua il logout dal sistema dell'utente resettando la variabile di sessione.
*/
PROCEDURE processLogout;

end package_gui;

